package application.windows;

import application.anno.*;
import application.anno.impl.InjectionImpl;
import application.entity.StageEntity;
import application.manager.DialogManager;
import javafx.scene.Node;
import javafx.scene.control.Alert;
import javafx.scene.control.ButtonType;
import javafx.scene.control.DialogPane;
import javafx.scene.image.Image;
import javafx.stage.Stage;

import java.io.IOException;
import java.lang.reflect.Field;

/**
 * 自定义弹出窗口
 * 在其子类上方使用Layout注解，设置弹出窗口的布局
 * 使用DialogTips设置窗口的左上方提示信息
 * 使用IconName设置窗口的左上方图标
 * 使用DialogContext设置弹出窗口的提示信息
 */
public class CustomizedDialog extends Alert {

    public CustomizedDialog() {
        super(AlertType.NONE);
        try {
            init();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }

    public CustomizedDialog(String contentText, ButtonType... buttons) {
        super(AlertType.NONE, contentText, buttons);
        try {
            init();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }

    private void init() throws IOException, IllegalAccessException {
        // 获取类对象
        Class<? extends CustomizedDialog> aClass = this.getClass();
        // 获取DialogContext注解
        DialogContext context = aClass.getAnnotation(DialogContext.class);
        if (context != null) {
            // 如果注解不为空，则设置dialog的提示文本
            this.setContentText(context.context());
        }
        // 获取DialogTips对象
        DialogTips tips = aClass.getAnnotation(DialogTips.class);
        if (tips != null) {
            // 设置窗口左上方的提示信息
            this.setTitle(tips.tips());
        }

        // 获取DialogPane布局
        DialogPane dialogPane = getDialogPane();
        // 获取Layout注解
        Layout layout = aClass.getAnnotation(Layout.class);
        if (layout != null && !layout.value().isEmpty()) {
            // 清除掉DialogPane原本的布局组件
            dialogPane.getChildren().clear();
            // 获取Dialog管理者
            DialogManager dialogManager = DialogManager.getInstance();
            // 注册Dialog新的布局
            StageEntity register = dialogManager.register(layout.value());
            // 设置DialogPane的新布局
            dialogPane.setExpandableContent(register.getPane());
            dialogPane.setExpanded(true);
        }
        // 解决Dialog窗口左上方关闭时效的问题
        dialogPane.getButtonTypes().add(ButtonType.CLOSE);
        Node closeButton = this.getDialogPane().lookupButton(ButtonType.CLOSE);
        closeButton.managedProperty().bind(closeButton.visibleProperty());
        closeButton.setVisible(Boolean.FALSE);
        // 获取IconName注解
        IconName iconName = aClass.getAnnotation(IconName.class);
        if (iconName != null) {
            // 若IconName不为空则继续判断
            if (!iconName.value().isEmpty()) {
                // 若iconName中的图片路径不为空则获取Dialog窗口对象
                Stage stage = (Stage) getDialogPane().getScene().getWindow();
                // 清空原始图标
                stage.getIcons().clear();
                // 设置新图标
                stage.getIcons().add(new Image(getClass().getClassLoader().getResource("image/".concat(iconName.value())).toString()));
            }
        }

        StageTitle annotation = aClass.getAnnotation(StageTitle.class);
        if (annotation != null) {
            String value = annotation.value();
            Stage stage = (Stage) getDialogPane().getScene().getWindow();
            stage.setTitle(value);
        }
        // 下列方法用于在窗口启动时，做一些成员变量的自动注入操作。
        Field[] fields = this.getClass().getDeclaredFields();
        for (Field field : fields) {
            if ((field.getAnnotation(Injection.class)) != null) {
                InjectionImpl injection = new InjectionImpl();
                injection.injectionField(this);
            }
        }
    }

}
